hvm: fix XSAVE leaf 0 EBX size calculation
authorKeir Fraser <keir@xen.org>
Sun, 6 Feb 2011 17:26:31 +0000 (17:26 +0000)
committerKeir Fraser <keir@xen.org>
Sun, 6 Feb 2011 17:26:31 +0000 (17:26 +0000)
Fixes a size calculation bug when enabled bits in XFEATURE_MASK (xcr0)
aren't contiguous.

Current for_loop will stop when xcr0 feature bit is 0. But in reality,
the bits can be non-contiguous. One example is that LWP is bit 62 on
AMD platform. This patch iterates through all bits to calculate the
size for enabled features.

Signed-off-by: Wei Huang <wei.huang2@amd.com>
xen/arch/x86/hvm/hvm.c

index 23db7de28228fecaca2c3f9ce077a17f3c0b4345..da78d1c3850087a58e534f8661a908f4a31fc9b9 100644 (file)
@@ -2222,10 +2222,12 @@ void hvm_cpuid(unsigned int input, unsigned int *eax, unsigned int *ebx,
         /* EBX value of main leaf 0 depends on enabled xsave features */
         if ( count == 0 && v->arch.xcr0 ) 
         {
-            for ( sub_leaf = 2; 
-                  (sub_leaf < 64) && (v->arch.xcr0 & (1ULL << sub_leaf));
-                  sub_leaf++ ) 
+            /* reset EBX to default value first */
+            *ebx = 576; 
+            for ( sub_leaf = 2; sub_leaf < 64; sub_leaf++ )
             {
+                if ( !(v->arch.xcr0 & (1ULL << sub_leaf)) )
+                    continue;
                 domain_cpuid(v->domain, input, sub_leaf, &_eax, &_ebx, &_ecx, 
                              &_edx);
                 if ( (_eax + _ebx) > *ebx )